package dao

import (
	"fmt"
	models "yuanaiproblem/dao/model" // 导入用户相关模型
	"yuanaiproblem/migrations/db"    // 导入数据库连接
)

// GetUsers 分页查询用户列表
// 支持按用户名模糊查询、按角色筛选，返回用户列表、总数和错误
func GetUsers(username, role string, page, pageSize int) ([]models.User, int64, error) {
	// 分页参数合法性校验与默认值处理
	// 页码小于1时，默认查询第1页
	if page < 1 {
		page = 1
	}
	// 页大小小于1或大于100时，默认使用10（限制最大页大小避免性能问题）
	if pageSize < 1 || pageSize > 100 {
		pageSize = 10
	}

	// 构建查询条件：只查未删除用户
	query := db.DB.Model(&models.User{}).Where("deleted_at IS NULL")

	// 用户名筛选（模糊匹配）
	if username != "" {
		query = query.Where("username LIKE ?", "%"+username+"%")
	}
	// 角色筛选（精确匹配）
	if role != "" {
		query = query.Where("role = ?", role)
	}

	// 查询总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		return nil, 0, err
	}

	// 计算分页偏移量（经过参数校验后，page和pageSize一定是有效值）
	offset := (page - 1) * pageSize
	var users []models.User

	// 执行分页查询（当总记录数为0时，直接返回空列表避免无效查询）
	if total > 0 {
		if err := query.Offset(offset).Limit(pageSize).Find(&users).Error; err != nil {
			return nil, 0, err
		}
	}

	// 打印最终生效的分页参数（方便调试）
	fmt.Printf("有效分页参数：page=%d, pageSize=%d, offset=%d, 总记录数=%d\n",
		page, pageSize, offset, total)

	return users, total, nil
}

// GetUserByID 查询用户
// 按ID查询用户信息，返回用户指针或错误
func GetUserByID(id int32) (*models.User, error) {
	var user models.User // 存储查询到的用户
	result := db.DB.First(&user, id)
	if result.Error != nil {
		return nil, result.Error
	}
	return &user, nil
}

// UpdateUser 更新用户
// 按字段更新用户信息，入参用户指针和更新字段映射
func UpdateUser(user *models.User, updates map[string]interface{}) error {
	return db.DB.Model(user).Updates(updates).Error
}

// CheckUsernameExists 检查用户名是否存在（排除当前用户）
// 用于更新用户名时判断唯一性，返回是否存在和错误
func CheckUsernameExists(username string, excludeID int32) (bool, error) {
	// 存储匹配数量
	var count int64
	err := db.DB.Model(&models.User{}).
		Where("username = ? AND id != ?", username, excludeID).
		Count(&count).Error
	return count > 0, err
}

// DeleteUser 软删除用户
// 入参用户指针，执行软删除操作
func DeleteUser(user *models.User) error {
	return db.DB.Delete(user).Error
}
